//用两个栈实现一个队列。队列的声明如下，请实现它的两个函数 appendTail 和 deleteHead ，
// 分别完成在队列尾部插入整数和在队列头部删除整数的
//功能。(若队列中没有元素，deleteHead 操作返回 -1 ) 
// 示例 1：
// 输入：
//["CQueue","appendTail","deleteHead","deleteHead"]
//[[],[3],[],[]]
//输出：[null,null,3,-1]
// 示例 2：
// 输入：
//["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
//[[],[],[5],[2],[],[]]
//输出：[null,-1,null,null,5,2]
// 提示：
// 1 <= values <= 10000
// 最多会对 appendTail、deleteHead 进行 10000 次调用 
// Related Topics 栈 设计 队列 👍 487 👎 0

package leetcode.editor.offer;

import java.util.Stack;

class YongLiangGeZhanShiXianDuiLieLcof {
    public static void main(String[] args) {
        CQueue solution = new YongLiangGeZhanShiXianDuiLieLcof().new CQueue();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    // 剑指 Offer 09. 用两个栈实现队列
    class CQueue {
        /**
         * Your CQueue object will be instantiated and called as such:
         * CQueue obj = new CQueue();
         * obj.appendTail(value);
         * int param_2 = obj.deleteHead();
         */

        public CQueue() {
            stack1 = new Stack<>();
            stack2 = new Stack<>();
        }

        Stack<Integer> stack1;
        Stack<Integer> stack2;

        public void appendTail(int value) {
            // 加入队尾 appendTail()函数： 将数字 val 加入栈 A 即可。
            stack1.push(value);
        }

        public int deleteHead() {
            // 复杂了一步
//            while (!stack1.isEmpty()) {
//                stack2.push(stack1.pop()); // 栈二入栈栈一的所有元素后弹出最后一个即可
//            }
//            stack2.pop();
//            while (!stack1.isEmpty()) {
//                stack1.push(stack2.pop()); // 栈二入栈栈一的所有元素后弹出最后一个即可
//            }
//            return 0;

            // 删除队首deleteHead()函数： 有以下三种情况。
            // 当栈 B 不为空： B中仍有已完成倒序的元素，因此直接返回 B 的栈顶元素。
            // 否则，当 A 为空： 即两个栈都为空，无元素，因此返回 -1。
            // 否则： 将栈 A 元素全部转移至栈 B 中，实现元素倒序，并返回栈 B 的栈顶元素。
            if (!stack2.isEmpty()) return stack2.pop();
            else if (stack1.isEmpty()) return -1;
            else {
                while (!stack1.isEmpty()) {
                    stack2.push(stack1.pop());
                }
                return stack2.pop();
            }
        }
    }

//leetcode submit region end(Prohibit modification and deletion)

}
